package com.hrm.houfei.biz.impl;

import java.util.Date;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

import com.hrm.houfei.biz.IMoneyStandardBiz;
import com.hrm.houfei.dao.IMoneyDetailsDAO;
import com.hrm.houfei.dao.IMoneyInfoDAO;
import com.hrm.houfei.jsonfactory.moneystandard.ConvertJsonToObject;
import com.hrm.houfei.jsontools.JSONArray;
import com.hrm.houfei.jsontools.JSONException;
import com.hrm.houfei.jsontools.JSONObject;
import com.hrm.houfei.po.Moneydetails;
import com.hrm.houfei.po.Moneyinfo;
import com.hrm.houfei.po.Userinfo;

/**
 * 薪酬标准信息业务
 * 
 * @author Administrator
 * 
 */
public class MoneyStanardBizImpl implements IMoneyStandardBiz {
	// 薪酬标准单dao
	private IMoneyInfoDAO imidao;
	// 薪酬项目dao
	private IMoneyDetailsDAO imddao;

	public void setImddao(IMoneyDetailsDAO imddao) {
		this.imddao = imddao;
	}

	public void setImidao(IMoneyInfoDAO imidao) {
		this.imidao = imidao;
	}

	public MoneyStanardBizImpl() {
		super();
	}
	
	/**
	 * 统计薪酬分布情况
	 * @return
	 */
	public List<Moneyinfo> countReportMoneyInfo(){
		return this.imidao.findAll();
	}

	/**
	 * @title 薪酬编号是否存在
	 * @param standardId
	 *            薪酬编号
	 * @return 存在返回 true,否则返回false
	 */
	public boolean isExistStandardId(String standardId) {
		List list = this.imidao.findByProperty("miStandardId", standardId
				.trim());
		if (list.size() > 0) {
			return true;
		}
		return false;
	}

	/**
	 * @title 根据薪酬标准号查询薪酬标准单信息
	 * @param standardId
	 * @return
	 */
	public Moneyinfo getMoneyInfoByStandardId(String standardId) {
		List<Moneyinfo> list = this.imidao.findByProperty("miStandardId",
				standardId.trim());
		return list.get(0);
	}

	/**
	 * @title 制定薪酬标准
	 * @param jsonMoneyItems
	 *            薪酬标准项目
	 * @param jsonMoneyInfo
	 *            薪酬标准信息
	 * @param addName
	 *            登记人姓名
	 * @return 1已存在,2失败,3成功
	 */
	public int makeMoneyStandard(String jsonMoneyItems, String jsonMoneyInfo,
			String addName) {
		try {
			// 将标准信息json转换成实体
			Moneyinfo mi = ConvertJsonToObject.convertJsonToMoneyinfo(
					jsonMoneyInfo, addName);
			// 如果该薪酬编号已存在
			if (this.isExistStandardId(mi.getMiStandardId()) == true) {
				// 编号已存在
				return 1;
			} else {
				mi.setMiAddDate(new Date());
				mi.setMiState("未审核");
				// 保存薪酬信息
				this.imidao.save(mi);
				// 保存薪酬项目信息
				JSONArray jsonArray = new JSONArray(jsonMoneyItems);
				// 遍历薪酬项目
				for (int i = 0; i < jsonArray.length(); i++) {
					JSONObject jo = jsonArray.getJSONObject(i);
					Moneydetails md = ConvertJsonToObject
							.convertJsonToMoneydetails(jo.toString(), mi
									.getMiStandardId(), mi.getMiStandardName(),
									false);
					this.imddao.save(md);
				}
				// 制定成功
				return 3;
			}
		} catch (JSONException e) {
			// 制定失败
			return 2;
		}
	}

	/**
	 * 分页显示薪酬标准信息
	 * 
	 * @param start
	 *            索引
	 * @param limit
	 *            每页要显示的记录条数
	 * @return 当前页的所有记录
	 */
	public List<Moneyinfo> showMoneyInfoByPage(String start, String limit) {
		if (null == start || "".equals(start)) {
			start = "0";
		}
		if (null == limit || "".equals(limit)) {
			limit = "10";
		}
		// 离线查询
		DetachedCriteria criteria = DetachedCriteria.forClass(Moneyinfo.class);
		// criteria.add(Restrictions.eq("miState", "未审核"));
		// 调用dao
		List<Moneyinfo> list = this.imidao.findByPage(criteria, Integer
				.parseInt(start), Integer.parseInt(limit));
		return list;
	}

	/**
	 * 根据条件显示所有薪酬标准信息
	 * 
	 * @param condition
	 *            状态
	 */
	public List<Moneyinfo> showAllMoneyInfo(String condition) {
		List<Moneyinfo> list = null;
		if (null != condition && !"".equals(condition)) {
			list = this.imidao.findByProperty("miState", condition);
		} else {
			list = this.imidao.findAll();
		}
		return list;
	}

	/**
	 * 获取薪酬标准单信息总记录的条数
	 * 
	 * @return
	 */
	public int getCountMoneyInfoByCondtion() {
		return this.imidao.findAll().size();
	}

	/**
	 * 根据薪酬编号显示该编号的所有薪酬项目信息
	 * 
	 * @param standardId
	 *            薪酬标准编号
	 * @return List<Moneydetails>
	 */
	public List<Moneydetails> showMoneyItemsByStandardId(String standardId) {
		List<Moneydetails> list = this.imddao.findByProperty("miStandardId",
				standardId);
		return list;
	}

	/**
	 * 审核薪酬标准(通过审核)
	 * 
	 * @param standardId
	 *            薪酬标准号
	 * @param checkComment
	 *            审核意见
	 * @param user
	 *            当前登陆用户实体
	 * @return 成功返回true,失败返回false
	 */
	public boolean updateCheckMoneyStandard(String standardId,
			String checkComment, Userinfo user, String isPass) {
		try {
			List<Moneyinfo> miList = this.imidao.findByProperty("miStandardId",
					standardId);
			Moneyinfo mi = miList.get(0);
			mi.setMiCheckComment(checkComment);
			mi.setUserCheckName(user.getUserTrueName());
			mi.setMiCheckDate(new Date());
			if (isPass.equals("true")) {
				mi.setMiState("通过审核");
			} else {
				mi.setMiState("未通过审核");
			}
			this.imidao.updateMoneyInfoByStandardId(mi);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 薪酬标准变更
	 * 
	 * @param formValues
	 *            薪酬标准表单Json数据
	 * @param gridValues
	 *            薪酬标准表格Json数据集
	 * @param user
	 *            当前登陆用户
	 * @return 成功返回true,失败返回false
	 * 
	 */
	public boolean updateMoneyStandard(String formValues, String gridValues,
			Userinfo user) {
		try {
			// json转换工具
			JSONObject jo = new JSONObject(formValues);
			// 获取薪酬标准号
			String miStandardId = jo.getString("miStandardId");
			// 获取薪酬标准名
			String miStandardName = jo.getString("miStandardName");

			// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
			// /// 更新薪酬标准项目详细信息
			// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
			JSONArray jsonArray = new JSONArray(gridValues);
			// 遍历薪酬项目,循环更新已经修改的薪酬项目详细信息
			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject myjo = jsonArray.getJSONObject(i);
				Moneydetails md = ConvertJsonToObject
						.convertJsonToMoneydetails(myjo.toString(),
								miStandardId, miStandardName, true);
				this.imddao.update(md);
			}
			// 根据薪酬标准号获取所有薪酬标准项目的详细信息
			List<Moneydetails> list = this.imddao.findByProperty(
					"miStandardId", miStandardId);
			double countMoney = 0.00;
			// 遍历薪酬项目,循环更新薪酬项目详细信息的薪酬标准名
			for (int i = 0; i < list.size(); i++) {
				Moneydetails monde = list.get(i);
				monde.setMiStandardName(miStandardName);
				countMoney += monde.getMdValue();
				this.imddao.update(monde);
			}

			// 获取该薪酬编号的薪酬总金额

			// ///////////////////////////////////////////////////////////////////////////////////////////////////////
			// /// 更新薪酬标准单信息
			// ///////////////////////////////////////////////////////////////////////////////////////////////////////
			// 根据薪酬标准号获取薪酬标准信息实体(封装实体)
			Moneyinfo moneyInfo = (Moneyinfo) this.imidao.findByProperty(
					"miStandardId", miStandardId).get(0);
			moneyInfo.setMiStandardName(miStandardName);
			moneyInfo.setMiEditDate(new Date());
			moneyInfo.setUserEditName(user.getUserTrueName());
			moneyInfo.setMiCountMoney(countMoney);
			// 调用dao更新薪酬标准信息
			this.imidao.updateMoneyInfoByStandardId(moneyInfo);
			return true;
		} catch (Exception e) {
			return false;
		}

	}

}
